package interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/*
拦截器Interceptor
类似于Servlet中的【过滤器Filter】，用于对进入controller的请求进行预处理和后处理。
应用场景：
1日志记录
2权限检查
3性能监控
4通用行为：读取cookie得到用户信息并将用户对象放入请求，从而方便后续的流程使用
本质是面向切面编程，也就是说，符合横切关注点的所有功能都可以放入拦截器实现。
 */
public class MyInterceptor implements HandlerInterceptor {
    /*
    在控制器controller处理请求之前被调用
    1 [拦截] 该方法的返回值是布尔值Boolean 类型的，当它返回为false 时，表示请求结束,
    后续的Interceptor 和Controller 都不会再执行；
    2 [放行] 当返回值为true 时就会继续调用下一个Interceptor 的preHandle 方法，
    如果已经是最后一个Interceptor 的时候就会是调用当前请求的Controller方法
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        System.out.println("interceptor-----preHandle");


        return true;
    }

    /*
    在controller处理请求 结束之后，在dispatcherServlet进行视图数据渲染之前，调用该方法
    所以我们可以在这个方法中对Controller处理之后的ModelAndView对象进行操作
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//        System.out.println("interceptor-----postHandle");
    }

    /*
    在DispatcherServlet渲染了对应的视图之后执行
    这个方法的主要作用是用于进行资源清理工作
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//        System.out.println("interceptor-----afterCompletion");
    }
}
